package com.rm.zeyou.config.mpconfig;


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 *
 */
public class MybatisPlusGenerator {

    public static void main(String[] args) {


        // 为create_time和update_time字段添加自动填充注解
        List<com.baomidou.mybatisplus.generator.IFill> tableFillList = new ArrayList<>();
        tableFillList.add(new Column("create_time", FieldFill.INSERT));
        tableFillList.add(new Column("update_time", FieldFill.INSERT_UPDATE));
        // TODO 改为自己的包名（必改）
        String parentPackage = "com.rm.zeyou";

        String mapperXmlPath = "/src/main/resources/mapper";
        // TODO 作者名字
        String author = "YanYang";

        // 数据库连接信息
        // TODO 数据库信息（必改）
        String url = "jdbc:mysql://127.0.0.1:3306/xishidaojia?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8";
        String username = "root";
        String password = "root";

        // 表名集合
        List<String> tables = new ArrayList<>();


        // TODO 生成的表名称（必改）

         //tables.add("t_aftersales_order");
         //tables.add("t_banner_config");
         //tables.add("t_broker");
         //tables.add("t_broker_consume_detail");
         //tables.add("t_broker_payout_detail");
         //tables.add("t_channel_consume_detail");
         //tables.add("t_channel_merchants");
         //tables.add("t_channel_payout_detail");
         //tables.add("t_city_config");
         //tables.add("t_city_fare_config");
         //tables.add("t_city_fare_global_config");
         //tables.add("t_clock_item");
         //tables.add("t_clock_item_specs");
         //tables.add("t_coupon_config");
         //tables.add("t_dict_config");
         //tables.add("t_feedback");
         //tables.add("t_item");
         //tables.add("t_item_guarantee_config");
         //tables.add("t_item_specs");
         //tables.add("t_limit_coupon_config");
         //tables.add("t_limit_coupon_matches_config");
         //tables.add("t_member_config");
         //tables.add("t_merchant");
         //tables.add("t_partners");
         //tables.add("t_recruitment");
         //tables.add("t_salesman");
         //tables.add("t_salesman_consume_detail");
         //tables.add("t_salesman_payout_detail");
         //tables.add("t_share_config");
         //tables.add("t_technician");
         //tables.add("t_technician_appraise");
         //tables.add("t_technician_authentication");
         //tables.add("t_technician_avatar_audit");
         //tables.add("t_technician_back");
         //tables.add("t_technician_consume_detail");
         //tables.add("t_technician_item_order");
         //tables.add("t_technician_life_photo_audit");
         //tables.add("t_technician_payout_detail");
         //tables.add("t_technician_shield");
         //tables.add("t_technician_time");
         //tables.add("t_technician_type");
         //tables.add("t_user");
         //tables.add("t_user_address");
         //tables.add("t_user_appraise");
         //tables.add("t_user_attention");
         //tables.add("t_user_back");
         //tables.add("t_user_collection");
         //tables.add("t_user_consume_detail");
         //tables.add("t_user_coupon");
         //tables.add("t_user_item_order");
         //tables.add("t_user_label");
         //tables.add("t_user_member");
         //tables.add("t_user_member_order");
         //tables.add("t_user_payout_detail");
         //tables.add("t_user_invite");
         //tables.add("t_message");
         //tables.add("t_city_vote");
         //tables.add("t_grade_config");
         //tables.add("t_channel_merchants_config");
         //tables.add("t_salesman_apply");
         //tables.add("t_channel_apply");
         //tables.add("t_broker_apply");
         //tables.add("t_payout_config");
         //tables.add("t_refund_order");
         //tables.add("t_notice");
         //tables.add("t_agreement_config");
         //tables.add("t_down_config");
         //tables.add("t_payout_dict_config");
         //tables.add("t_order_dict_config");
         //tables.add("t_middle_relation");
         //tables.add("t_voice_notify");
         //tables.add("t_voice_template_config");
         //tables.add("t_sms_template_config");
         //tables.add("t_aliyun_oss_config");
         //tables.add("t_application_config");
         //tables.add("t_pay_config");
         //tables.add("t_wxpay_config");
         //tables.add("t_zfbpay_config");
         //tables.add("t_user_zfb_count");
         //tables.add("t_technician_zfb_count");
         //tables.add("t_backend_order_notify");
         //tables.add("t_technician_sos");
         tables.add("t_middle_notify");





        FastAutoGenerator.create(url, username, password)
                // 全局配置
                .globalConfig(builder->{
                    builder.fileOverride()
                            .disableOpenDir()
                            .outputDir(System.getProperty("user.dir") + "/src/main/java")
                            .author(author)
                            .enableSwagger()
                            .dateType(DateType.ONLY_DATE)
                            .commentDate("yyyy-MM-dd HH:mm:ss");
                })
                // 包配置
                .packageConfig(builder->{
                    builder.parent(parentPackage)
                            .entity("entity")
                            .service("service")
                            .serviceImpl("service.impl")
                            .mapper("mapper")
                            .xml("mapper.xml")
                            .controller("controller")
                            //.other("config")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + mapperXmlPath));
                })


                // 策略配置
                .strategyConfig(builder->{
                    builder.addInclude(tables)
                            // TODO 表名前缀（例如：t_user表生成的实体类为TUser,添加配置后可省略前缀）
                            .addTablePrefix("t_")
                            //开始配置服务接口和服务实现类的生成
                            .serviceBuilder()
                            //设置服务接口的文件名格式为[表名]Service
                            .formatServiceFileName("%sService")
                            //设置服务实现类的文件名格式为[表名]ServiceImpl
                            .formatServiceImplFileName("%sServiceImpl")
                            //开始配置实体类的生成，并启用文件覆盖功能（如果目标文件已存在，则会被新生成的文件覆盖）
                            .entityBuilder()
                            .fileOverride()
                            //启用Lombok库的支持，Lombok可以通过注解减少样板代码，如getter/setter方法等。
                            .enableLombok()
                            //指定逻辑删除字段的名称为is_delete。这常用于软删除记录，而不是直接从数据库中删除
                            .logicDeleteColumnName("is_delete")
                            //添加自动填充规则，tableFillList应该是一个包含填充配置的集合。这允许在插入或更新记录时自动设置某些字段的值（例如，创建时间、更新时间等）
                            .addTableFills(tableFillList)
                            //指定乐观锁的版本字段名为version
                            .versionColumnName("version")
                            //启用字段注解，这有助于在生成的实体类中添加额外的注解，如JPA注解或MyBatis注解
                            .enableTableFieldAnnotation()
                            //开始配置控制器的生成
                            .controllerBuilder()
                            //设置控制器的文件名格式为[表名]Controller
                            .formatFileName("%sController")
                            //启用REST风格的控制器生成
                            .enableRestStyle()
                            //开始配置映射器的生成
                            .mapperBuilder()
                            //设置映射器的基类为BaseMapper，BaseMapper是MyBatis Plus提供的一个强大基类，包含了许多常用的CRUD方法
                            .superClass(BaseMapper.class)
                            //设置映射器的文件名格式为[表名]Mapper
                            .formatMapperFileName("%sMapper")
                            //启用映射器注解的生成
                            .enableMapperAnnotation()
                            //设置映射器XML文件的文件名格式为[表名]Mapper
                            .formatXmlFileName("%sMapper")
                            //再次启用文件覆盖功能
                            .fileOverride()
                            //启用基础结果映射和基础列列表的生成，这有助于处理复杂的查询结果映射
                            .enableBaseResultMap().enableBaseColumnList();
                }).execute();
    }

}

